home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 1 / Cream of the Crop 1.iso / WINDOWS / PROFFT.ARJ / GENPWIN.CPP < prev    next >
C/C++ Source or Header  |  1992-04-28  |  14KB  |  400 lines

  1. /****************************************************************************
  2.             GENPWIN.CPP    Denne filen inneholder (i denne rekkef°lgen):
  3. *****************************************************************************
  4. TGenericPicWindow::TGenericPicWindow(PTWindowsObject AParent, LPSTR FName,
  5.                                                                 BITMAPINFO *bmpInfo, HANDLE hBitmap, BOOL bBitmap)
  6. TGenericPicWindow::~TGenericPicWindow()
  7. void TGenericPicWindow::Paint(HDC, PAINTSTRUCT& PaintInfo)
  8. void TGenericPicWindow::AdjustScroller()
  9. void TGenericPicWindow::WMSize(TMessage& Msg)
  10. void TGenericPicWindow::EditCopy()
  11. BOOL TGenericPicWindow::LockBMP()
  12. void TGenericPicWindow::UnlockBMP()
  13. BITMAPINFO* TGenericPicWindow::MakeDuplicateBMPInfo(LPBITMAPINFO source)
  14. void TGenericPicWindow::CopyBMP(HANDLE hSourceBitmap, HANDLE hTargetBitmap)
  15. ****************************************************************************/
  16. #include <owl.h>
  17. #include <filedial.h>
  18. #include <dir.h>
  19. #include <string.h>
  20.  
  21. #pragma hdrstop
  22. #include "profftid.h" // Symbolske konstanter
  23. #include "profft.h"   // Klassedefinisjoner
  24.  
  25. TGenericPicWindow::TGenericPicWindow(PTWindowsObject AParent, LPSTR FName,
  26.                                                                 BITMAPINFO *bmpInfo, HANDLE hBitmap, BOOL bBitmap)
  27.     : TWindow(AParent, "")
  28. /****************************************************************************
  29. Setter opp et standard vindu til bruk i vσr applikasjon. Denne
  30. konstruktoren passer pσ at vinduet fσr riktig stil, dvs. at det er
  31. flyttbart, har scrollbars o.l. I tillegg passer den pσ at vinduet fσr
  32. en beskrivende overskrift.
  33.  
  34. PTWindowsObject AParent        Peker til foreldrevinduet (TMainWindow i vσr
  35.                                                     applikasjon).
  36.  
  37. LPSTR Caption  Peker til en streng som skal komme fram i vindusoverskriften.
  38.  
  39. BITMAPINFO *bmpInfo  Peker til et BITMAPINFO struktur. MERK! Denne
  40.                                          strukturen mσ vµre    allokert f°r pekeren sendes
  41.                                          videre til konstruktoren (dvs.    konstruktoren tar
  42.                                          seg ikke av minneallokeringen).
  43.  
  44. HANDLE hBitmap  Windows handle til et omrσde i minnet som inneholder
  45.                                 rσdataene i et bitmap bilde (merk _ikke_ et Windows
  46.                                 bitmapobjekt!). Denne forutsettes σ vµre allokert pσ
  47.                                 forhσnd.
  48.  
  49. BOOL bBitmap        Forteller om subklassen er et bitmap eller komplekst
  50.                                 bilde.
  51.  
  52. Returnerer:     NULL hvis det av en eller annen grunn ikke gikk an σ
  53.                                 lage instansiere objektet (f.eks. for lite minne).
  54.  
  55. Krever:  At det pσ forhσnd er allokert minne til BITMAPINFO strukturen
  56.                  og en handle til bitmap bildet.
  57.  
  58. Informasjon:
  59.     Vitsen med σ kreve forhσndsallokering er at vi ikke vet om dataene er
  60.     gyldig f°r vi har sjekket de (etter vi har allokert de). Ved σ gj°re det
  61.     pσ denne mσten, allokerer vi ikke et "ugyldig" objekt, dvs. et objekt
  62.     som inneholder "svada" data. Hvis det viser seg at dataene vi leser
  63.     inn er ugyldige, s°rger bare den funksjonen som skulle til σ instansiere
  64.     ett nytt TGenericPicWindow objekt (dvs. eg. en subklasse av denne) σ
  65.     deallokere minne og la vµre σ instansiere objektet.
  66.  
  67. Kodet av:     MK    12.03.92
  68. *****************************************************************************/
  69. {
  70.     char TitleStr[MAX_CAPTION_LENGTH];
  71.     char TempStr[MAX_CAPTION_LENGTH];
  72.     char acTemp[20];
  73.     RECT rect;
  74.     int iScreenY, iW, i;
  75.  
  76.     //  Setter riktig vindusstil med scrollbars.
  77.     Attr.Style |= WS_VSCROLL | WS_HSCROLL;
  78.     Scroller = new TScroller(this, 1, 1, 200, 200);     // Lager scrollbars
  79.  
  80.     //  Setter riktig overskrift pσ vinduet. Hvis bildet er et bitmap bilde
  81.     //  (fra disk eller clipboard) vises hele filadressen. Hvis ikke vises
  82.     //  kun navnet som bildet stammer fra (siste delen av hele filnavnet)
  83.     //  Hvis bildet stammer fra clipboard (FName[0]="<") vises dette spesiellt.
  84.  
  85.     if (bBitmap)
  86.     {
  87.         strcpy(TitleStr, "Bmp: ");
  88.         lstrcat(TitleStr, FName);            // Kopierer caption i temporµre TitleStr
  89.     }
  90.     else
  91.     {
  92.         strcpy(TitleStr, "Complex: ");
  93.         if (FName[0]!='<')
  94.         {
  95.             fnsplit((char const *)FName, NULL, NULL, TempStr, NULL);
  96.             lstrcat(TitleStr, TempStr);
  97.  
  98.             //  Fjerner filspesifikasjonen pσ bilder som stammer fra dette
  99.             lstrcpy(FName, TempStr);
  100.         }
  101.         else
  102.             lstrcat(TitleStr, FName);
  103.     }
  104.  
  105.     //  Henter bildest°rrelsen og legger denne til i overskriften.
  106.     wsprintf(acTemp, "  (%ldx%ld)", bmpInfo->bmiHeader.biWidth, bmpInfo->bmiHeader.biHeight);
  107.     lstrcat(TitleStr, acTemp);
  108.  
  109.     Title = _fstrdup(TitleStr);            // og allokerer denne dynamisk.
  110.     TGenericPicWindow::bmpInfo = bmpInfo;  // Peker til BITMAPINFO struktur
  111.     TGenericPicWindow::hBitmap = hBitmap;  // Handle til bitmap dataene
  112.  
  113.     //  Tar var pσ hele filnavnet til senere bruk.
  114.     lstrcpy(FileName, FName);
  115.  
  116.     //  Denne fors°ker σ sette vindusst°rrelsen slik at bildet passer
  117.     //  n°yaktig inn. Hvis bildet er for lite, settes vindusst°rrelsen
  118.     //  sσ liten som mulig. Hvis bildet er for stort brukes default
  119.     //  st°rrelse og scrollbars. Merk! Den benytter hovedvinduets
  120.     //  st°rrelse nσr den regner ut posisjoneringen, siden alle
  121.     //  barnevinduer skal befinne seg i hovedvinduet.
  122.     GetClientRect(AParent->HWindow, &rect);
  123.     if (bmpInfo->bmiHeader.biWidth<=(rect.right-rect.left))
  124.         Attr.W=(int)bmpInfo->bmiHeader.biWidth+2*GetSystemMetrics(SM_CXFRAME);
  125.     if (bmpInfo->bmiHeader.biHeight<=(rect.bottom-rect.top))
  126.         Attr.H=(int)bmpInfo->bmiHeader.biHeight
  127.                 +GetSystemMetrics(SM_CYCAPTION)+2*GetSystemMetrics(SM_CYFRAME)-1;
  128. }
  129.  
  130. TGenericPicWindow::~TGenericPicWindow()
  131. /****************************************************************************
  132. Rydder opp f°r TGenericPicWindow objektet fjerner seg selv. Det vil si
  133. at denne destruktoren deallokerer minnet til BITMAPINFO strukturen og
  134. frigj°r handelen til bitmap bildet.
  135.  
  136. Kodet av:   MK  12.03.92
  137. *****************************************************************************/
  138. {
  139.     if (hBitmap)
  140.         GlobalFree(hBitmap);  // Frigj°r bitmapbilde dataene.
  141.     if (bmpInfo!=NULL)
  142.         delete bmpInfo;                // Frigj°r infostrukturen til bitmapbildet.
  143. }
  144.  
  145.  
  146. #pragma -w-sus
  147. void TGenericPicWindow::Paint(HDC, PAINTSTRUCT& PaintInfo)
  148. /****************************************************************************
  149. Viser bitmapbildet i vinduet nσr dette objektet fσr beskjed om σ vise
  150. seg (dvs. mottar en WM_PAINT beskjed).
  151.  
  152. PAINTSTRUCT& PaintInfo        PAINTSTRUCT som inneholder omrσdet som mσ
  153.                                                     tegnes om.
  154. Kodet av:
  155.     13.03.92/MK: Laget funksjonen for f°rste gang.
  156.     19.03.92/MK: Forandret funksjonen slik at den ikke lager et bitmap
  157.                              objekt, men beholder bildeinformasjonen. Var n°dvendig fordi
  158.                              vi er avhengige av σ hente fram alle grσtonene for σ
  159.                              transformere.
  160.     10.04.92/MK: La inn st°tte for σ vise filtrene hvis brukeren holder
  161.                              pσ med filtrering (r°de ringer).
  162. *****************************************************************************/
  163. {
  164.     HDC MemoryDC;
  165.     HANDLE OldBitmapHandle;
  166.     RECT rectClient;
  167.     char huge *hpPixels;
  168.  
  169.     if (hBitmap)    // Hvis det faktisk finnes noe bilde
  170.     {
  171.         if (IsIconic(HWindow))
  172.         {
  173.             ; // Display icon
  174.         }
  175.         else
  176.         {
  177.             //  Velger hovedvinduets palette (som faktisk inneholder
  178.             //  de grσtonene som er aktuelle.
  179.             SelectPalette(PaintInfo.hdc, ((TMainWindow *)Parent)->hPal, 0);
  180.             SetMapMode(PaintInfo.hdc, MM_TEXT);
  181.  
  182.             if (LockBMP())  //  Hvis vi fσr en peker til bildet (fσes i LockBMP())
  183.             {
  184.  
  185.                 //  "Maler" DeviceIndependet bitmappen vσr pσ klientomrσdet
  186.                 //  i vinduet.
  187.                 SetDIBitsToDevice(PaintInfo.hdc, 0, 0,
  188.                     bmpInfo->bmiHeader.biWidth, bmpInfo->bmiHeader.biHeight,
  189.                     0, 0, 0, bmpInfo->bmiHeader.biHeight,
  190.                     &hpBitmap[0], bmpInfo, DIB_RGB_COLORS);
  191.  
  192.                 UnlockBMP();
  193.             }
  194.             else
  195.                 MessageBox(HWindow, "TGenericPicWindow::Paint hpPixel==NULL", ERROR_CAPTION, MB_ERROR);
  196.         }
  197.      }
  198. }
  199. #pragma -wsus
  200.  
  201.  
  202. void TGenericPicWindow::AdjustScroller()
  203. /****************************************************************************
  204. Justerer scrollbars i.h.t. vinduet. Brukes ved lasting av nye bilder og
  205. ved justering av billedst°rrelsen.
  206.  
  207. Sist forandret:
  208.     13.03.92/MK: Laget funksjonen for f°rste gang.
  209. *****************************************************************************/
  210. {
  211.     //  Setter riktig omrσde pσ scrollbarene og viser °verste venstre
  212.     //  del av bildet.
  213.     Scroller->SetRange(bmpInfo->bmiHeader.biWidth - Attr.W,
  214.                                          bmpInfo->bmiHeader.biHeight - Attr.H);
  215.     Scroller->ScrollTo(0,0);
  216.     InvalidateRect(HWindow, NULL, TRUE);  // Be vinduet oppdatere seg
  217. }
  218.  
  219.  
  220. void TGenericPicWindow::WMSize(TMessage& Msg)
  221. /****************************************************************************
  222. Mottar WM_SIZE beskjeder fra Windows og sender disse videre til
  223. superklassen. Passer ogsσ pσ σ kalle AdjustScroller() hvis vindus-
  224. st°rrelsen forandres.
  225.  
  226. TMessage& Msg   Sendes videre til superklassens tilsvarene funksjon.
  227.  
  228. Sist forandret:
  229.     13.03.92/MK: Laget funksjonen for f°rste gang.
  230. *****************************************************************************/
  231. {
  232.  TWindow::WMSize(Msg);
  233.  if ((Msg.WParam!=SIZEICONIC))
  234.     AdjustScroller();
  235. }
  236.  
  237. void TGenericPicWindow::EditCopy()
  238. /****************************************************************************
  239. Kopierer bitmapbildet til det aktive barnevinduet til clipboard.
  240. Kalles ved menyvalg Copy eller Cut.
  241.  
  242. Kodet av:     MK    24.04.92
  243. Modifisert:    MK    26.04.92  Fikset bugs i forbindelse med store (>64K)
  244.                                                     bitmaps. Skyldtes feil i C sine biblioteks-
  245.                                                     rutiner som feiler hvis en funksjon adresserer
  246.                                                     forbi et segmentskifte (64K).
  247. *****************************************************************************/
  248. {
  249.     WORD wSize;
  250.     int iY, iW, iH, iNum;
  251.     HDC hdc;
  252.     HPALETTE hCbdPalette;
  253.     HANDLE hMem;
  254.     char huge *hpMem;
  255.     long lSize, Count;
  256.     HCURSOR hcrOld;
  257.  
  258.     iW = (int)bmpInfo->bmiHeader.biWidth;  //  Lagrer disse for σ minske
  259.     iH = (int)bmpInfo->bmiHeader.biHeight; //  aksess og skriverarbeid.
  260.     if (LockBMP())  //  Hvis vi fσr en peker til bildet..
  261.     {
  262.         //  Vis timeglasset (byte til bytekopiering tar litt tid)
  263.         hcrOld = SetCursor(((TMainWindow *)Parent)->hcrWait);
  264.  
  265.         //  St°rrelsen pσ bildestrukturdataene
  266.         wSize = sizeof(BITMAPINFOHEADER) + ((1 << bmpInfo->bmiHeader.biBitCount) * sizeof(RGBQUAD));
  267.  
  268.         //  Bildest°rrelsen
  269.         lSize = (((bmpInfo->bmiHeader.biBitCount*iW) + 31)/32)*4;
  270.         lSize = lSize*iH;
  271.  
  272.         //  Alloker minne til kopi til clipboard
  273.         hMem=GlobalAlloc(GHND,lSize+wSize);
  274.         if (hMem!=NULL)
  275.         {
  276.             hpMem = (char huge *)GlobalLock(hMem);
  277.  
  278.             //  Kopier bildestrukturdataene
  279.             _fmemcpy(hpMem, bmpInfo, wSize);
  280.  
  281.             //  Sett pekeren til σ peke pσ det stedet hvor bildedataene skal
  282.             //  begynne.
  283.             hpMem=&hpMem[wSize];
  284.  
  285.             //  Foreta en byte for byte kopiering. Ja, det er dσrlig, men
  286.             //  dessverre klarte ikke _fmemcpy dette (selv om jeg kopierte
  287.             //  linje for linje) sσ dette ble den letteste utveien jeg hadde
  288.             //  tid til. Allikevel, sσ sent er det da ikke.
  289.             for (Count=0;Count<lSize;Count++)
  290.                 *hpMem++=*hpBitmap++;
  291.  
  292.             GlobalUnlock(hMem);
  293.             UnlockBMP();
  294.  
  295.             //  Lag en ekstra grσtonepalette som clipboard kan fσ.
  296.             hCbdPalette = ((TMainWindow *)Parent)->CreateGrayscalePalette();
  297.  
  298.             //  Send clipboard kopiene av dataene som vi har laget.
  299.             OpenClipboard(HWindow);
  300.             EmptyClipboard();
  301.             if (SetClipboardData(CF_DIB, hMem)==NULL)
  302.                 MessageBox(HWindow, "Copy: Error transfering data", ERROR_CAPTION, MB_ERROR);
  303.             if (hCbdPalette!=NULL)
  304.                 SetClipboardData(CF_PALETTE, hCbdPalette);
  305.             CloseClipboard();
  306.         }
  307.         else
  308.             MessageBox(HWindow, "Copy: Unable to create clipboard copy of bitmap",
  309.                     ERROR_CAPTION, MB_ERROR);
  310.     }
  311.     else
  312.         MessageBox(HWindow, "Copy: Unable to lock bitmap",
  313.                 ERROR_CAPTION, MB_ERROR);
  314.     ReleaseDC(HWindow, hdc);
  315.     SetCursor(hcrOld);
  316. }
  317.  
  318. BOOL TGenericPicWindow::LockBMP()
  319. /****************************************************************************
  320. Locker bitmapbildet og lagrer en huge pointer til det.
  321.  
  322. Returnerer:        TRUE hvis det lot seg lock
  323.                             FALSE ellers
  324.  
  325. Kodet av:     MK
  326. *****************************************************************************/
  327. {
  328.     hpBitmap = (char huge *)GlobalLock(hBitmap);
  329.     if (hpBitmap!=NULL)
  330.         return TRUE;
  331.     else
  332.         return FALSE;
  333. }
  334.  
  335. void TGenericPicWindow::UnlockBMP()
  336. /****************************************************************************
  337. Unlocker bitmapbildet (hpBitmap ikke lenger brukbar).
  338.  
  339. Kodet av:     MK    19.04.92
  340. *****************************************************************************/
  341. {
  342.     GlobalUnlock(hBitmap);
  343. }
  344.  
  345. BITMAPINFO* TGenericPicWindow::MakeDuplicateBMPInfo(LPBITMAPINFO source)
  346. /****************************************************************************
  347. Denne allokerer en kopi av bildestrukturdataene og returnerer en peker
  348. til denne.
  349.  
  350. LPBITMAPINFO source        Peker til orginalen (dvs. den det skal kopieres
  351.                                             fra).
  352.  
  353. Kommentar:  Denne ligger som en medlemsfunksjon, selv om den egentlig
  354.                         ikke hadde trengt σ vµre det. Allikevel virket det naturlig.
  355.  
  356. Advarsel:     Denne har ingen feilsjekking pσ om vi er tom for minne!
  357.  
  358. Kodet av:     MK
  359. *****************************************************************************/
  360. {
  361.     WORD wSize;
  362.     BITMAPINFO *target;
  363.  
  364.     wSize = sizeof(BITMAPINFOHEADER) + ((1 << source->bmiHeader.biBitCount) * sizeof(RGBQUAD));
  365.     target = (BITMAPINFO *)new char[wSize];
  366.     _fmemcpy(target, source, wSize);
  367.     return target;
  368. }
  369.  
  370. void TGenericPicWindow::CopyBMP(HANDLE hSourceBitmap, HANDLE hTargetBitmap)
  371. /****************************************************************************
  372. Kopierer informasjon fra en bitmap til en annen.
  373.  
  374. HANDLE hSourceBitmap    Bitmap som det skal kopieres fra.
  375. HANDLE hTargetBitmap  Bitmap som det skal kopieres til.
  376.  
  377. Kodet av:     MK
  378. *****************************************************************************/
  379. {
  380.     char huge *source, huge *destination;
  381.     int n, iY, iMaxY;
  382.  
  383.     source = (char far *)GlobalLock(hSourceBitmap);
  384.     destination = (char far *)GlobalLock(hTargetBitmap);
  385.     if ((source!=NULL) && (destination!=NULL))
  386.     {
  387.         iMaxY = bmpInfo->bmiHeader.biHeight-1;
  388.         n = bmpInfo->bmiHeader.biWidth;
  389.  
  390.         //  Kopierer bitmappene radvis
  391.         for (iY=iMaxY;iY>=0;iY--)
  392.             _fmemcpy(&destination[(long)iY*n], &source[(long)iY*n], n);
  393.     }
  394.     else
  395.         MessageBox(HWindow, "TGenericPicWindow::CopyBMP lock failed",
  396.                 ERROR_CAPTION, MB_ERROR);
  397.     GlobalUnlock(hSourceBitmap);
  398.     GlobalUnlock(hTargetBitmap);
  399. }
  400.